home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 051-075 / scopedisk61 / dchecker / getdevinfo.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  3KB  |  113 lines

  1. /*-
  2.  * getdevinfo.c - get filesystem information about a disk device
  3.  *
  4.  * DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
  5.  *
  6. -*/
  7.  
  8. #include        "libraries/dos.h"
  9. #include        "libraries/dosextens.h"
  10. #include        "libraries/filehandler.h"
  11. #include        <exec/memory.h>
  12.  
  13. #include        <ctype.h>
  14. #include        <stdio.h>
  15.  
  16. #include        "devinfo.h"
  17.  
  18. extern struct DosLibrary *DOSBase;
  19. extern void    *AllocMem();
  20.  
  21. #define CTOB(x) (void *)(((long)(x))>>2)        /* BCPL conversion */
  22. #define BTOC(x) (void *)(((long)(x))<<2)
  23.  
  24. touppers(s)
  25. char           *s;
  26. {
  27.     while (*s) {
  28.         *s = (islower(*s)) ? toupper(*s) : *s;
  29.         s++;
  30.     }
  31. }
  32.  
  33. void
  34. BtoCStr(cstr, bstr)
  35. char           *cstr;
  36. BPTR            bstr;
  37. {
  38.     char           *bstr2;
  39.     int             i;
  40.  
  41.     bstr2 = BTOC(bstr);
  42.     for (i = 0; i < bstr2[0]; i++) {
  43.         cstr[i] = bstr2[i + 1];
  44.     }
  45.     cstr[i] = '\0';
  46. }
  47.  
  48.  
  49. struct MyDevInfo *
  50. getDevInfo(name)
  51. char           *name;
  52. {
  53.     struct RootNode *root;
  54.     struct DosInfo *info;
  55.     struct DeviceNode *dnode;
  56.     struct FileSysStartupMsg *fsmsg;
  57.     struct DosEnvec *env;
  58.     long            unit;
  59.     char            dosname[20];
  60.     char            execname[256];
  61.     long            flags;
  62.     struct MyDevInfo *mdi;
  63.     root = (struct RootNode *) DOSBase->dl_Root;
  64.     info = (struct DosInfo *) BTOC(root->rn_Info);
  65.     dnode = (struct DeviceNode *) BTOC(info->di_DevInfo);
  66.  
  67.     for (; dnode != NULL;) {
  68.         if (dnode->dn_Type == DLT_DEVICE) {
  69.             BtoCStr(dosname, dnode->dn_Name);
  70.             if (strcmp(name, dosname) == 0) {
  71.                 /* found it! */
  72.                 fsmsg = (struct FileSysStartupMsg *) BTOC(dnode->dn_Startup);
  73.                 if (fsmsg != NULL) {
  74.                     char           *bcplname;
  75.                     long            namelen;
  76.  
  77.                     mdi = AllocMem(sizeof(*mdi), MEMF_CLEAR);
  78.                     bcplname = BTOC(fsmsg->fssm_Device);
  79.                     namelen = bcplname[0] + 1;
  80.                     mdi->DeviceName = AllocMem(namelen, 0L);
  81.                     BtoCStr(mdi->DeviceName, fsmsg->fssm_Device);
  82.                     mdi->Unit = fsmsg->fssm_Unit;
  83.                     mdi->DeviceFlags = fsmsg->fssm_Flags;
  84.                     env = BTOC(fsmsg->fssm_Environ);
  85.                     mdi->BlockSize = env->de_SizeBlock * 4;
  86.                     mdi->Surfaces = env->de_Surfaces;
  87.                     mdi->BlocksPerTrack = env->de_BlocksPerTrack;
  88.                     mdi->Reserved = env->de_Reserved;
  89.                     mdi->PreAlloc = env->de_PreAlloc;
  90.                     mdi->LowCyl = env->de_LowCyl;
  91.                     mdi->HighCyl = env->de_HighCyl;
  92.                     if (env->de_TableSize >= 12) {
  93.                         mdi->BufMemType = env->de_BufMemType;
  94.                     }
  95.                     else {
  96.                         mdi->BufMemType = MEMF_CHIP;
  97.                     }
  98.                     if (env->de_TableSize >= 16) {
  99.                         mdi->DosType = env->de_DosType;
  100.                     }
  101.                     else {
  102.                         mdi->DosType = 0x444f5300;
  103.                     }
  104.  
  105.                     return mdi;
  106.                 }
  107.             }
  108.         }
  109.         dnode = (struct DeviceNode *) BTOC(dnode->dn_Next);
  110.     }
  111.     return NULL;
  112. }
  113.